package net.hands.common.web.html;

import java.util.Map.Entry;
import java.util.Properties;

import net.hands.common.Convert;
import net.hands.common.StringUtils;

/**
 * 说明:html创建
 * <br>
 * <p>这是一个开源的软件，请在LGPLv3下合法使用、修改或重新发布。</p>
 * @author 陈侃(cknet@126.com, 13910090885)
 *         http://code.google.com/p/simpleframework/
 *         http://www.simpleframework.net
 */
public abstract class HtmlBuilder {
   /**
    * 分隔线
    */
	public static String SEP = "<span style=\"margin: 0px 4px;\">|</span>";
   /**
    * 空格分隔
    */
	public static String NAV = "<span style=\"margin: 0px 2px;\">&raquo;</span>";
   /**
   * 说明:隐藏元素  如"<input Type='hidden' name=名称值 value=值 />"
   * @param name 名称
   * @param value  值
   * @return String
   * @update 2012-9-20 下午3:07:37
    */
	public static String hidden(final String name, final Object value) {
		return input("hidden", name, value);
	}
  /**
  * 说明:input 元素 如"<input Type=类型  name=名称值  value=值 />"
  * @param Type 类型
  * @param name 名称
  * @param value 值
  * @return String
  * @update 2012-9-20 下午3:08:02
   */
	public static String input(final String type, final String name, final Object value) {
		final Properties properties = new Properties();
		properties.setProperty("Type", type);
		properties.setProperty("id", name);
		properties.setProperty("name", name);
		properties.setProperty("value", Convert.toString(value));
		return tag("INPUT", null, properties);
	}
   /**
   * 说明:超链接 a
   * @param text 内容
   * @param href  超链接
   * @return String
   * @update 2012-9-20 下午3:08:46
    */
	public static String a(final String text, final String href) {
		return a(text, href, null);
	}
   /**
   * 说明:超链接 a
   * @param text 内容
   * @param href  超链接
   * @param style 样式
   * @return String
   * @update 2012-9-20 下午3:09:30
    */
	public static String a(final String text, final String href, final String style) {
		return a(text, href, style, null, false);
	}
   /**
   * 说明:超链接 a
   * @param text 内容
   * @param href 超链接
   * @param style 样式
   * @param clazz 样式名称
   * @param _blank 跳转新页
   * @return String
   * @update 2012-9-20 下午3:10:04
    */
	public static String a(final String text, final String href, final String style,
			final String clazz, final boolean _blank) {
		final Properties properties = new Properties();
		if (StringUtils.hasText(href)) {//判断超链接内容是否为空
			if (href.toLowerCase().startsWith("javascript:")) {//超链接是否为javascript:开头
				properties.setProperty("onclick", href.substring(11));//是做截取javascript:
			} else {
				properties.setProperty("href", href);//设置超链接属性
			}
		} else {
			properties.setProperty("href", "#");//设置超链接为#
		}
		if (StringUtils.hasText(style)) {
			properties.setProperty("style", style);
		}
		if (StringUtils.hasText(clazz)) {
			properties.setProperty("class", clazz);
		}
		if (_blank) {//是否跳转新页面
			properties.setProperty("target", "_blank");
		}
		return tag("A", text, properties);
	}
   /**
   *  说明:转html标签字符
   * @param tagName 标签名
   * @param properties 属性集合
   * @return  String
   * @update 2012-9-20 下午3:13:58
    */
	public static String tag(final String tagName, final Properties properties) {
		return tag(tagName, null, properties);
	}
   /**
   * 说明:生成html标签字符串
   * @param tagName 标签名
   * @param text  内容
   * @param properties 属性集合
   * @return String
   * @update 2012-9-20 下午3:19:11
    */
	public static String tag(final String tagName, final String text, final Properties properties) {
		if (!StringUtils.hasText(tagName)) {//标签名不存在 返回null
			return "";
		}
		final StringBuilder sb = new StringBuilder();
		sb.append("<").append(tagName);//标签名
		if (properties != null) {
			for (final Entry<Object, Object> entry : properties.entrySet()) {//便利属性
				sb.append(" ").append(entry.getKey()).append("=\"");
				sb.append(HtmlEncoder.text((String) entry.getValue()));
				sb.append("\"");
			}
		}
		if (text != null) {//标签中间内容
			sb.append(">");
			sb.append(text).append("</").append(tagName).append(">");
		} else {
			sb.append("/>");
		}
		return sb.toString();
	}
}
